import { useTagsViewStore } from '@/store/modules/tagsView';
import router from '@/router';
import { RouteLocationNormalized, RouteMeta, NavigationFailure } from 'vue-router';
import { CustomRoute } from '@/types/route'

export interface TabOperations {
  refreshPage(obj?: CustomRoute): Promise<void | NavigationFailure | undefined>;
  closeOpenPage(obj?: CustomRoute): Promise<void | NavigationFailure | undefined>;
  closePage(obj?: CustomRoute): Promise<void | { visitedViews: CustomRoute[] } | NavigationFailure | undefined>;
  closeAllPage(): void;
  closeLeftPage(obj?: CustomRoute): Promise<CustomRoute[]>;
  closeRightPage(obj?: CustomRoute): Promise<CustomRoute[]>;
  closeOtherPage(obj?: CustomRoute): Promise<void | NavigationFailure | undefined>;
  openPage(url: string): Promise<void | NavigationFailure | undefined>;
  updatePage(obj: CustomRoute): void;
}

/**
 * Tab 相关操作的工具类。
 */
const tabOperations: TabOperations = {
  /**
   * 刷新当前 tab 页签。
   * @param {CustomRoute | undefined} [obj] - 要刷新的标签对象。如果未提供，则从当前路由获取。
   * @returns {Promise<void | NavigationFailure | undefined>} - 返回一个 Promise，表示刷新操作完成。
   */
  refreshPage(obj?: CustomRoute): Promise<void | NavigationFailure | undefined> {
    const { path, query, matched } = router.currentRoute.value as RouteLocationNormalized;

    if (!obj) {
      for (const m of matched) {
        if (m.components && m.components.default && m.components.default.name) {
          if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
            obj = {
              name: m.components.default.name || 'Unnamed',
              path,
              query,
              meta: m.meta || {},
            } as unknown as CustomRoute;
            break;
          }
        }
      }
    }

    return useTagsViewStore().delCachedView(obj!).then(() => {
      const { path, query } = obj!;
      return router.replace({
        path: '/redirect' + path,
        query,
      });
    }).catch((error: NavigationFailure) => {
      // 处理导航失败的情况
      console.error('Navigation failed:', error);
      throw error; // 或者根据需要进行其他处理
    });
  },

  /**
   * 关闭当前 tab 页签，并打开新页签。
   * @param {View | undefined} [obj] - 新页签的对象。如果未提供，则只关闭当前页签。
   * @returns {Promise<void | NavigationFailure | undefined>} - 如果提供了新页签对象，则返回一个 Promise；否则直接返回。
   */
  closeOpenPage(obj: CustomRoute | undefined): Promise<void | NavigationFailure | undefined> {
    useTagsViewStore().delView(router.currentRoute.value as unknown as CustomRoute);

    if (obj !== undefined) {
      return router.push(obj).catch((error: NavigationFailure) => {
        // 处理导航失败的情况
        console.error('Navigation failed:', error);
        throw error; // 或者根据需要进行其他处理
      });
    } else {
      // 如果没有提供新的页签对象，则返回一个 resolved 的 Promise
      return Promise.resolve(undefined);
    }
  },

  /**
   * 关闭指定 tab 页签。
   * @param {View | undefined} [obj] - 要关闭的标签对象。如果未提供，则关闭当前页签。
   * @returns {Promise<void | { visitedViews: View[] } | NavigationFailure | undefined>} - 返回一个 Promise，表示关闭操作完成。
   */
  closePage(obj?: CustomRoute): Promise<void | { visitedViews: CustomRoute[] } | NavigationFailure | undefined> {
    if (!obj) {
      return useTagsViewStore().delView(router.currentRoute.value as CustomRoute).then(({ visitedViews }) => {
        const latestView = visitedViews.slice(-1)[0];
        if (latestView) {
          return router.push(latestView.fullPath as string).catch((error: NavigationFailure) => {
            // 处理导航失败的情况
            console.error('Navigation failed:', error);
            throw error; // 或者根据需要进行其他处理
          });
        }
        return router.push('/');
      }).catch((error: NavigationFailure) => {
        // 处理导航失败的情况
        console.error('Navigation failed:', error);
        throw error; // 或者根据需要进行其他处理
      });
    }
    return useTagsViewStore().delView(obj!);
  },

  /**
   * 关闭所有 tab 页签。
   * @returns {void} - 没有返回值。
   */
  closeAllPage(): void {
    useTagsViewStore().delAllViews();
  },

  /**
   * 关闭左侧 tab 页签。
   * @param {View | undefined} [obj] - 当前标签对象。如果未提供，则使用当前路由。
   * @returns {Promise<View[]>} - 返回一个 Promise，包含剩余的标签视图。
   */
  closeLeftPage(obj?: CustomRoute): Promise<CustomRoute[]> {
    return useTagsViewStore().delLeftTags(obj || (router.currentRoute.value as CustomRoute));
  },

  /**
   * 关闭右侧 tab 页签。
   * @param {View | undefined} [obj] - 当前标签对象。如果未提供，则使用当前路由。
   * @returns {Promise<View[]>} - 返回一个 Promise，包含剩余的标签视图。
   */
  closeRightPage(obj?: CustomRoute): Promise<CustomRoute[]> {
    return useTagsViewStore().delRightTags(obj || (router.currentRoute.value as CustomRoute));
  },

  /**
   * 关闭其他 tab 页签（除了当前页签）。
   * @param {View | undefined} [obj] - 当前标签对象。如果未提供，则使用当前路由。
   * @returns {Promise<void | NavigationFailure | undefined>} - 返回一个 Promise，表示关闭操作完成。
   */
  closeOtherPage(obj?: CustomRoute): Promise<void | NavigationFailure | undefined> {
    return useTagsViewStore().delOthersViews(obj || (router.currentRoute.value as CustomRoute)).then(() => {
      // 这里可以添加额外的逻辑，例如跳转到某个特定页面
    }).catch((error: NavigationFailure) => {
      // 处理导航失败的情况
      console.error('Navigation failed:', error);
      throw error; // 或者根据需要进行其他处理
    });
  },

  /**
   * 打开一个新的 tab 页签。
   * @param {string} url - 要打开的新页签的 URL。
   * @returns {Promise<void | NavigationFailure | undefined>} - 返回一个 Promise，表示导航操作完成。
   */
  openPage(url: string): Promise<void | NavigationFailure | undefined> {
    return router.push(url).catch((error: NavigationFailure) => {
      // 处理导航失败的情况
      console.error('Navigation failed:', error);
      throw error; // 或者根据需要进行其他处理
    });
  },

  /**
   * 修改指定的 tab 页签。
   * @param {View} obj - 要修改的标签对象。
   * @returns {void} - 没有返回值。
   */
  updatePage(obj: CustomRoute): void {
    useTagsViewStore().updateVisitedView(obj);
  }
};

export default tabOperations;